#ifndef PREREQUISITES_H
#define PREREQUISITES_H

#include "Framework/Platform.h"
#include "Framework/Types.h"

namespace tyro
{


	namespace Camera
	{
		class Camera;
	}

	namespace Framework
	{
		class LogFile;
		class Timer;
		class NameGenerator;
		class ScriptInterface;
		class Parameter;
		class ParameterCommand;
		class ParameterDictionary;
		template <class T> class SharedPtr;
	}

	namespace Geometry
	{
		class CustomObject;
		class CustomObjectSection;
		class Frustum;
		class Object;
		class Plane;

		typedef vector<CustomObjectSection*>::type CustomObjectSectionList;
	}

	namespace Graphics
	{
		class Colour;
		class GLDeviceVertexBuffer;
		class IDeviceBuffer;
		class IDeviceVertexBufferSharedPtr;
		class IDeviceIndexBufferSharedPtr;
		class IDeviceVertexBuffer;
		class IDeviceIndexBuffer;
		class IDeviceBufferManager;
		class IDeviceBufferManagerBase;
		class GLDeviceBufferManager;
		class GLDeviceBufferManagerBase;
		class GLRenderEngine;
		class IRenderEngine;
		class IRenderTarget;
		class IRenderable;
		class IRenderOperation;
		class IRenderWindow;
		class VertexIndexData;
		class IViewport;
		class VertexBufferBinding;
		class VertexData;
		class VertexDeclaration;
		class VertexElement;
		class Pass;
		class Material;
		class MaterialPtr;
		class MaterialManager;
		class Technique;
	}

	namespace IO
	{
		class IFile;
		class IFileSystem;
		class PCFileSystem;
		class Resource;
		class ResourceManager;
		class ResourceGroupManager;
	}

	namespace Math
	{
		template <class T> class Degree;
		template <class T> class Matrix2;
		template <class T> class Matrix3;
		template <class T> class Matrix4;
		template <class T> class Quaternion;
		template <class T> class Radian;
		template <class T> class Vector2;
		template <class T> class Vector3;
		template <class T> class Vector4;

		/* Type definitions */
		typedef Matrix2<FLOAT_32> Matrix2f;
		typedef Matrix2<FLOAT_64> Matrix2d;
		typedef Matrix3<FLOAT_32> Matrix3f;
		typedef Matrix3<FLOAT_64> Matrix3d;
		typedef Matrix4<FLOAT_32> Matrix4f;
		typedef Matrix4<FLOAT_64> Matrix4d;
		typedef	Quaternion<FLOAT_32> Quaternionf;
		typedef Quaternion<FLOAT_64> Quaterniond;
		typedef Radian<FLOAT_32> Radianf;
		typedef Radian<FLOAT_64> Radiand;
		typedef Vector2<FLOAT_32> Vector2f;
		typedef Vector2<FLOAT_64> Vector2d;
		typedef Vector3<FLOAT_32> Vector3f;
		typedef Vector3<FLOAT_64> Vector3d;
		typedef Vector4<FLOAT_32> Vector4f;
		typedef Vector4<FLOAT_64> Vector4d;

	}

	namespace OS
	{
		class GLWin32WindowManager;
		class IWindowManager;
		class WindowEventUtils;
	}

	namespace Scene
	{
		class Node;
		class SceneNode;
		class ISceneManager;
		class IRenderableCollection;
		class IRenderPriorityGroup;
		class IRenderQueue;
		class IRenderQueueGroup;
	}
}

#endif